package com.lagou.rabbitmq.consumer;

import com.lagou.rabbitmq.config.RabbitConfig;
import com.lagou.rabbitmq.controller.OrderController;
import com.lagou.rabbitmq.model.Order;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.annotation.RabbitListener;
import org.springframework.stereotype.Component;

/**
 * @ClassName Consumer
 * @Description TODO
 * @Author xsq
 * @Date 2020/11/12 18:51
 **/
@Slf4j
@Component
public class Consumer {
    /**
     * 在这里只需要监听死信队列,不需要监听正常队列,模拟的业务逻辑就是
     * 用户下订单买东西,当用户查询订单状态的时候,如果用户已经支付了,那么订单状态就是已支付,当走到死信队列的时候
     * 判断订单不是待支付就不执行任何业务逻辑消费了这条信息,当用户没有支付的时候查询订单状态就会显示一个订单还有15分钟可以支付的时间
     * ,就跟淘宝类似,到时间了触发死信队列,把订单状态从待支付改成已过期状态,查询订单状态就变成已过期,需要重新下单,解除对该商品在刚刚15分钟内的锁定,变成别人也可以买,
     * 回想下淘宝下单的流程,一模一样的,这里为了快速模拟测试,发送端队列过期时间只设置了10秒
     * @param id
     */
    @RabbitListener(queues = RabbitConfig.dlxQueueOrderName)
    public void onMessage(long id) {
        log.info("===========支付订单已过期========== orderId="+id);
        Order order = OrderController.orders.get(id);
        if (order.getStatus().equals("待支付")) {
            order.setStatus("已过期");
        }
        log.info("---------------设置消息为已过期状态");

    }
}
